cell3start = pause {
   enter        = music_("echo")
  ,time         = 4000
  ,next         = chain_ {
                    light_(true),
                    walk_("cell3")
                  }
}

cell3 = scene {
   _twall       = false
  ,_tshaft      = false
  ,_tceil       = false
  ,_tdoor       = false
  ,checkpoint   = true
  ,obj          = {
                     "cell3_start"
                    ,"cell3_recall"
                    ,"cell3_bed"
                    ,"cell3_device"
                    ,"cell3_shelf"
                    ,"cell3_shelfhandle"
                    ,"cell3_door"
                    ,"cell3_doorshelf"
                    ,"cell3_floor"
                    ,"cell2_eyes"
                    ,"cell_devicehandle"
                    ,"cell_shaft"
                    ,"cell_toilet"
                    ,"cell_walls"
                    ,"cell_ceil"
                    ,"cube2"
                    ,"triangle"
                    ,"sphere"
                    ,"cube_hole"
                    ,"triangle_hole"
                    ,"sphere_hole"
                    ,"cube3"
                  }
  ,ExamSelf     = choose_ {
                     ["default"] = [[Я стою посреди комнаты.]]
                    ,["hero._sit and hero._sitobj=='cell3_bed'"] = [[Я сижу на кровати, ссутулившись и глядя себе под ноги.]]
                    ,["hero._sit and hero._sitobj=='cell3_floor'"] = [[Я сижу прямо на холодном полу посреди своей камеры.]]
                  }
  ,Refresh      = concat_ {
                    [[Всё вокруг залито безжизненным белым светом.]],
                    apply_("rcall(cell3_floor.dsc,cell3_floor)"),
                    apply_("rcall(cell3_bed.dsc,cell3_bed)"),
                    apply_("rcall(cell3_shelf.dsc,cell3_shelf)")
                  }
  ,Cry          = choose_ {
                     ["cell3_device._talk==0 or cell3_device._talk==1 or cell3_device._talk==2 or cell3_device._talk==3 or cell3_device._talk==8 or cell3_device._talk==9 or (cell3_device._talk==6 and not cube3._took)"] = 
                        redirect_("Talk", "cell3_device")
                    ,["default"] = [[Я уже и так охрип от крика.]]
                  }
  ,Wait         = [[Я не понимаю, чего мне ждать.]]
  ,Exit         = [[Я уже начинаю сомневаться, что когда-нибудь смогу выбраться отсюда.]]
}

cell3_start = rooms.event
  [[Я сижу на полу посреди своей камеры. Свет вокруг стал таким нестерпимо ярким, что я думаю только об одном.^
    Темнота.^
    Я пытаюсь вспомнить свой первый полёт с инструктором, бесконечную темноту в иллюминаторе, пустоту в бездне меж двух
    галактик, но всё, что я вижу -- это свет, белый, безжизненный, проникающий повсюду. Я чувствую -- ещё немного, и я
    действительно сойду с ума. Мне не остаётся ничего, кроме как умолять.]]

cell3_recall = item {
   nam          = "полёт с инструктором|темноту в иллюминаторе|космос меж двух галактик"
  ,Recall       = [[Нет, ничего. Как будто мою память стёрли. Как будто её запомнила эта бессветная пустота.]]
}

cell3_door = from_("cell_door") {
   nam          = _"дверь"
  ,Exam         = choose_ {
                     ["default"] = redirect_("Exam", "cell_door")
                    ,["cube3._took"] =
                        [[Из массивной бронированной двери выдвинут тонкий металлический лоток, однако никакого отверстия
                          или люка в двери не видно.]]
                  }
}

cell3_floor = from_("cell_floor") {
   _sit         = false
  ,nam          = _"пол"
  ,dsc          = choose_ {
                     ["cube2._floor and triangle._floor and sphere._floor"] = [[На полу лежат куб, пирамида и сфера.]]
                    ,["cube2._floor and not triangle._floor and not sphere._floor"] = [[На полу лежит пластиковый куб.]]
                    ,["cube2._floor and triangle._floor and not sphere._floor"] = [[На полу лежат куб и пирамида.]]
                    ,["cube2._floor and not triangle._floor and sphere._floor"] = [[На полу лежат куб и сфера.]]
                    ,["not cube2._floor and triangle._floor and sphere._floor"] = [[На полу лежат пирамида и сфера.]]
                    ,["not cube2._floor and triangle._floor and not sphere._floor"] = [[На полу лежит пластиковая пирамида.]]
                    ,["not cube2._floor and not triangle._floor and sphere._floor"] = [[На полу лежит пластиковая сфера.]]
                    ,["not cube2._floor and not triangle._floor and not sphere._floor and not cube3._floor"] = [[]]
                    ,["cube3._floor"] = [[На полу валяется пластиковый куб.]]
                  }
  ,Exam         = choose_ {
                     ["default"] = "На полу ничего нет."
                    ,["cube2._floor or triangle._floor or sphere._floor or cube3._floor"] = apply_("'Я осматриваю пол. '..rcall(s.dsc,s)")
                  }
  ,Sit          = choose_ {
                     ["default"] =
                        chain_ {
                          set_("s._sit"),
                          [[Я сажусь на пол прямо посреди комнаты, но от напольных плиток исходит такой холод, что у меня начинает ломить кости.
                            Я поднимаюсь.]]
                        }
                    ,["s._sit"] = [[Я не собираюсь больше сидеть на этом холодном полу.]]
                  }
  ,Stand        = choose_ {
                     ["default"] = [[Я уже не сижу на полу.]]
                    ,["s._sit"] = [[Я и сам не понимаю, почему решил усесться прямо на этом холодном полу.]]
                  }
}

cell3_doorshelf = item {
   _sit         = false
  ,nam          = _"лоток"
  ,plural       = false
  ,live         = false
  ,Exam         = redirect_("Exam", "cell3_door")
  ,Approach     = [[Я подхожу к двери и какое-то время стою рядом с лотком, раздумывая.]]
  ,Move         = [[Не думаю, что стоит делать это, пока за мной следит голова робота.]]
  ,Sit          = choose_ {
                     ["default"] =
                        chain_ {
                          set_("s._sit"),
                          [[Я пытаюсь забраться на лоток, подтягиваюсь на руках и закидываю на лоток колено. Голова робота начинает
                            яростно трястись на кронштейне:^
                            -- Прекратить! Немедленно... действия... -- голос заходится в тяжелом металлическом кашле. -- Положите
                            куб на лоток! -- наконец, раздаётся с потолка.^
                            Я отхожу от двери.]]
                        }
                    ,["s._sit"] = [[Не думаю, что имеет смысл это делать.]]
                  }
  ,Lie          = [[Сомневаюсь, что это возможно.]]
  ,Wreck        = [[Я упираюсь в лоток ладонями и наваливаюсь на него всем весом, однако он даже и не думает сгибаться. Вряд ли
                    я смогу его сломать.]]
  ,Ascend       = redirect_("Sit")
  ,Stand        = redirect_("Sit")
  ,withPut      = true
  ,withPutAway  = true
  ,articles     = {
                     ["Stand"] = "на"
                    ,["Lie"] = "на"
                    ,["Put"] = "на"
                    ,["Throw"] = "на"
                    ,["PutAway"] = "на"
                  }
  ,cnd          = if_("cube3._took")
}:like(pBuild)

cell3_bed = from_("cell_bed") {
   nam          = _"кровать"
  ,dsc          = choose_ {
                     ["cube2._bed and triangle._bed and sphere._bed"] = [[^На кровати лежат куб, пирамида и сфера.]]
                    ,["cube2._bed and not triangle._bed and not sphere._bed"] = [[^На кровати лежит желтоватый пластиковый куб.]]
                    ,["cube2._bed and triangle._bed and not sphere._bed"] = [[^На кровати лежат куб и пирамида.]]
                    ,["cube2._bed and not triangle._bed and sphere._bed"] = [[^На кровати лежат куб и сфера.]]
                    ,["not cube2._bed and triangle._bed and sphere._bed"] = [[^На кровати лежат пирамида и сфера.]]
                    ,["not cube2._bed and triangle._bed and not sphere._bed"] = [[^На кровати лежит пластиковая пирамида.]]
                    ,["not cube2._bed and not triangle._bed and sphere._bed"] = [[^На кровати лежит ярко-красная пластиковая сфера.]]
                    ,["not cube2._bed and not triangle._bed and not sphere._bed"] = [[]]
                  }
  ,Exam         = choose_ {
                     ["default"] = redirect_("Exam", "cell_bed")
                    ,["cube2._bed or triangle._bed or sphere._bed"] = apply_("'Я осматриваю кровать.'..rcall(s.dsc,s)")
                  }
  ,Sit          = choose_ {
                     ["default"] = redirect_("Sit", "cell_bed")
                    ,["cell3_device._talk==7"] =
                        chain_ {
                          inc_("cell3_device._talk"),
                          [[Я послушно сажусь на кровать.^
                            -- Спасибо за сотрудничество, -- слышится искажённый голос, и голова робота вновь замирает.^
                            -- И что? -- кричу я. -- Это всё?! Но как же...^
                            Однако мне никто не отвечает. Я встаю.]]
                        }
                  }
  ,Lie          = [[Я больше не могу спать, пока в комнате горит этот испепеляющий свет. Ещё немного -- и я не выдержу.]]
}

cell3_device = from_("cell_robot") {
   _talk        = 0
  ,nam          = _"робот"
  ,Exam         = choose_ {
                     ["default"] =
                        [[Голова по-прежнему притворяется отключённой, уставившись в пол потухшим электрическим глазом.]]
                    ,["s._talk>2"] = [[У меня нет никакого желания разглядывать эту уродливую металлическую голову.]]
                  }
  ,Move         = [[Я не смогу дотянуться до механической головы.]]
  ,Wreck        = [[Как бы мне хотелось сорвать эту уродливую голову с кронштейна и разбить её о металлический пол! Но у меня
                    едва хватает сил, чтобы просто стоять на ногах.]]
  ,Talk         = choose_ {
                     ["default"] = 
                        chain_ {
                          inc_("s._talk"),
                          [[-- Выключите свет! -- кричу я в потолок. -- Пожалуйста! Я больше ни о чём не прошу! Дайте мне
                            отдохнуть!^
                            Но в ответ я слышу лишь тишину.]]
                        }
                    ,["s._talk==1"] =
                        chain_ {
                          inc_("s._talk"),
                          [[-- Выключите! Выключите! -- умоляю я. -- Хватит! Не нужно! Я...^
                            Я закрываю лицо руками, но перед глазами всё ещё стоит белая оглушительная пустота.]]
                        }
                    ,["s._talk==2"] =
                        chain_ {
                          inc_("s._talk"),
                          music_("droplet", 2),
                          [[-- Хватит! -- кричу я во весь голос. -- Вы же слышите меня! Просто выключите этот чёртов свет!
                            Выключите!..^
                            Внезапно где-то у потолка раздаётся резкий электрический щелчок. Я вздрагиваю и поднимаю голову.
                            Одна из панелей на потолке отодвигается, и в комнату с раздражающим монотонным жужжанием начинает
                            спускаться металлический контейнер, подвешенный на тонкой изогнутой трубе, напоминающей 
                            сломанную конечность.^
                            Механическая голова тут же оживает и принимается возбуждённо раскачиваться на кронштейне. Её
                            электрический глаз азартно поблёскивает.^
                            Контейнер, наконец, останавливается, повиснув на своей вывернутой руке где-то в метре от пола.
                            Надрывное электрическое жужжание замолкает, и контейнер шатко вздрагивает, едва не слетая со своего
                            хлипкого крепления.^
                            Механическая голова немного спускается на кронштейне -- кажется, что этот безумный робот сам
                            с любопытством разглядывает контейнер.^
                            На контейнере что-то лежит. Это мой жёлтый пластиковый куб! Рядом с ним есть сфера, закатившаяся
                            в квадратную лунку, и упавшая плашмя ярко-зелёная пластиковая пирамида.^
                            -- Пройдите тест, -- раздаётся знакомый металлический голос. -- Вставьте фигуры в отверстия.^
                            Я замечаю, что на верхней стороне контейнера есть три прорези в форме геометрических фигур -- круга,
                            треугольника и квадрата.]]
                        }
                    ,["s._talk==3 and (cube_hole._insert=='' or sphere_hole._insert=='' or triangle_hole._insert=='')"] = 
                        chain_ {
                          inc_("s._talk"),
                          [[-- Что это? Зачем всё это нужно? -- спрашиваю я.^
                            -- Пройдите тест, -- повторяет робот. -- Вставьте фигуры в отверстия.]]
                        }
                    ,["s._talk==4 and (cube_hole._insert=='' or sphere_hole._insert=='' or triangle_hole._insert=='')"] =
                        [[-- Вы что, издеваетесь? Зачем это всё нужно? Я вам что, подопытная обезьяна?^
                          -- Пройдите тест, -- невозмутимо повторяет голова робота. -- Вставьте фигуры в отверстия, -- и
                          добавляет: -- Пожалуйста.]]
                    ,["(s._talk==3 or s._talk==4) and cube_hole._insert~='' and sphere_hole._insert~='' and triangle_hole._insert~=''"] =
                        chain_ {
                          exec_("s._talk=5"),
                          [[-- Ну? Вы довольны? -- спрашиваю я. -- Что теперь? Очередной тест?^
                            Электрический глаз вспыхивает, и голова вдруг резко взмывает вверх, к самому потолку.^
                            -- Так что? -- говорю я. -- Вы довольны? Какое ещё развлечение придумаете?]]
                        }
                    ,["s._talk==5"] =
                        chain_ {
                          inc_("s._talk"),
                          mute_(4000,2000),
                          set_("cube3._floor"),
                          [[-- Спасибо! -- вдруг раздаётся мне в ответ.^
                            Контейнер на улогой металлической конечности шатко дрожит и медленно поднимается в отверстие на
                            потолке со знакомым натужным гулом. Однако на середине пути подъёмный кронштейн замирает, сервоприводы
                            надрывно взвывают, и вся эта странная конструкция начинает припадочно трястись, точно вот-вот готова
                            разлететься на кусочки. Однако уже спустя мгновение подъём возобновляется.^
                            К моим ногам падает пластиковый куб.^
                            -- Спасибо за сотрудничество, -- повторяет металлический голос, и голова робота снова засыпает.]]
                        }
                    ,["s._talk==6 and not cube3._took"] =
                        [[-- Дайте мне воды! -- кричу я. -- Выключите этот чёртов свет! -- но мне никто не отвечает.]]
                    ,["s._talk==6 and cube3._took"] =
                        [[-- Что, -- спрашиваю я, -- я не могу оставить себе эту пластиковую игрушку?^
                          -- Проявите благоразумие, -- настаивает голос.]]
                    ,["s._talk==7"] = [[Мне кажется, лучше просто сделать то, что они приказывают.]]
                    ,["s._talk==8"] = 
                        chain_ {
                          inc_("s._talk"),
                          [[Внезапно где-то у потолка раздаётся резкий отрывистый щелчок, комната на секунду погружается в темноту,
                            а потом снова загорается яркий испепеляющий свет.^
                            -- Выключите свет! -- кричу я. -- Выключите свет!^
                            Но меня никто не слышит. Механическая голова неподвижно висит на кронштейне. А свет выжигает мне глаза.
                            Кажется, он становится ярче с каждой секундой.]]
                        }
                    ,["s._talk==9"] = walkfast2_("dream2start")
                  }
  ,Listen       = choose_ {
                     ["default"] = [[Голова робота молчит.]]
                    ,["s._talk>2"] = redirect_("Talk")
                  }
}

cell3_shelf = item {
   nam          = _"контейнер"
  ,dsc          = choose_ {
                     ["default"] =
                      concat_ {
                        "Посреди комнаты висит металлический контейнер.",
                        apply_("s.itemdsc")
                      }
                    ,["cell3_device._talk>5"] = ""
                  }
  ,itemdsc      = concat_ {
                    choose_ {
                       ["cube2._shelf and triangle._shelf and sphere._shelf"] = [[На поверхности контейнера лежат куб, пирамида и сфера.]]
                      ,["cube2._shelf and not triangle._shelf and not sphere._shelf"] = [[На поверхности контейнера лежит пластиковый куб.]]
                      ,["cube2._shelf and triangle._shelf and not sphere._shelf"] = [[На поверхности контейнера лежат куб и пирамида.]]
                      ,["cube2._shelf and not triangle._shelf and sphere._shelf"] = [[На поверхности контейнера лежат куб и сфера.]]
                      ,["not cube2._shelf and triangle._shelf and sphere._shelf"] = [[На поверхности контейнера лежат пирамида и сфера.]]
                      ,["not cube2._shelf and triangle._shelf and not sphere._shelf"] = [[На поверхности контейнера лежит пластиковая пирамида.]]
                      ,["not cube2._shelf and not triangle._shelf and sphere._shelf"] = [[На поверхности контейнера лежи пластиковая сфера.]]
                      ,["not cube2._shelf and not triangle._shelf and not sphere._shelf"] = [[]]
                    },
                    if_("cube_hole._insert=='sphere'", [[В квадратную лунку провалилась пластиковая сфера.]]),
                    if_("cube_hole._insert=='cube2'", [[В квадратную лунку вставлен куб.]]),
                    if_("cube_hole._insert=='triangle'", [[Из квадратного отверстия криво торчит пирамида.]]),
                    if_("sphere_hole._insert=='sphere'", [[В круглую лунку вставлена сфера.]]),
                    if_("sphere_hole._insert=='triangle'", [[Из круглого отверстия торчит пирамида.]]),
                    if_("triangle_hole._insert=='triangle'", [[В треугольное отверстие вставлена пирамида.]])
                  }
  ,Exam         = concat_ {
                    [[Это небольшой металлический контейнер с тремя отверстиями -- в форме куба, круга и треугольника.]],
                    apply_("rcall(s.itemdsc,s)")
                  }
  ,Move         = [[Я немного раскачиваю контейнер, и его тонкое изогнутое крепление начинает надсадно поскрипывать.^
                    -- Прекратить! -- взывает голос с потолка. -- Такое поведение недопустимо!]]
  ,Open         = [[Кажется, этот контейнер невозможно открыть.]]
  ,Close        = [[Непонятно, как это сделать. Контейнер нельзя открыть или закрыть.]]
  ,Sit          = [[Это будет весьма затруднительно, да и непонятно, зачем делать это.]]
  ,Lie          = redirect_("Sit")
  ,Ascend       = [[Непонятно, зачем мне забираться на контейнер.]]
  ,Wreck        = [[Я обхватываю контейнер двумя руками и начинаю трясти его, пытаясь сорвать с крепления.^
                    -- Прекратить! -- орёт голова робота. -- Немедленно прекратить! Или мы вынуждены будем применить силу!]]
  ,Approach     = redirect_("Exam")
  ,Take         = [[Для начала придётся сломать крепление, на котором висит контейнер.]]
  ,TakeOff      = redirect_("Wreck")
  ,TearOff      = redirect_("Wreck")
  ,withPut      = true
  ,withPutIn    = true
  ,withPutAway  = true
  ,articles     = {
                     ["Put"] = "на"
                    ,["PutIn"] = "в"
                    ,["PutAway"] = "на"
                  }
  ,cnd          = if_("cell3_device._talk>=3 and cell3_device._talk<5")
}:like(pBuild) 

cell3_shelfhandle = item {
   nam          = name_ {
                     ["default"] = _"крепление"
                    ,["Wreck"] = _"крепление контейнера"
                  }
  ,Wreck        = redirect_("Wreck", "cell3_shelf")
  ,withTakeOff  = true
  ,withTearOff  = true
  ,articles     = {
                     ["TakeOff"] = "с"
                    ,["TearOff"] = "с"
                  }
  ,cnd          = if_("cell3_device._talk>=3 and cell3_device._talk<5")
}

function cell3_resetinsert(s)
  local nm = deref(s);
  local function f(o)
    if o._insert == nm then
      o._insert = '';
    end
  end
  f(cube_hole);
  f(triangle_hole);
  f(sphere_hole);
end

function cell3_insert(sh)
  return function(str)
    return chain_ {
      function(s)
        sh["_insert"] = deref(s)
      end,
      dropself,
      putself_(cell3),
      str
    }
  end
end

function cell3_noinsert(obj)
  return function(s)
    local str = "Боюсь, что " .. obj:M() .. " уже ";
    local ss = ref(obj._insert);
    if ss==cube2 then 
      return str.."вставлен пластиковый "..ss:M()..".";
    else 
      return str.."вставлена пластиковая "..ss:M().."."; 
    end
  end
end

cube_hole = item {
   _insert      = "sphere"
  ,nam          = _"квадратное отверстие"
  ,dsc          = choose_ {
                     ["s._insert=='cube2'"] = [[Пластиковый куб аккуратно вставлен в совпадающее с ним по форме отверстие.]]
                    ,["s._insert=='triangle'"] = [[Из квадратного отверстия криво торчит пластиковая пирамида.]]
                    ,["s._insert=='sphere'"] = [[Тёмно-красная сфера лежит в квадратном отверстии.]]
                  }
  ,Exam         = [[Это отверстие в форме квадрата.]]
  ,withPutIn    = true
  ,withPutAway  = true
  ,withInsert   = true
  ,withTakeFrom = true
  ,articles     = {
                     ["Insert"] = "в"
                    ,["Put"] = "в"
                    ,["Throw"] = "в"
                    ,["PutAway"] = "в"
                    ,["PutIn"] = "в"
                    ,["TakeFrom"] = "из"
                  }
  ,cnd          = if_("cell3_device._talk>=3 and cell3_device._talk<5")
}

sphere_hole = item {
   _insert      = ""
  ,nam          = _"круглое отверстие"
  ,dsc          = choose_ {
                     ["s._insert=='triangle'"] = [[В круглое отверстие грубо вбита острым концом ярко-зелёная пирамида.]]
                    ,["s._insert=='sphere'"] = [[Тёмно-красная сфера наполовину утоплена в круглой прорези на контейнере.]]
                  }
  ,Exam         = [[Это отверстие в форме круга.]]
  ,withPutIn    = true
  ,withPutAway  = true
  ,withInsert   = true
  ,withTakeFrom = true
  ,articles     = {
                     ["Insert"] = "в"
                    ,["Put"] = "в"
                    ,["Throw"] = "в"
                    ,["PutAway"] = "в"
                    ,["PutIn"] = "в"
                    ,["TakeFrom"] = "из"
                  }
  ,cnd          = if_("cell3_device._talk>=3 and cell3_device._talk<5")
}

triangle_hole = item {
   _insert      = ""
  ,nam          = _"треугольное отверстие"
  ,dsc          = choose_ {
                    ["s._insert=='triangle'"] = [[В треугольное отверстие вставлена пластиковая пирамида.]]
                  }
  ,Exam         = [[Это отверстие в форме треугольника.]]
  ,withPutIn    = true
  ,withPutAway  = true
  ,withInsert   = true
  ,withTakeFrom = true
  ,articles     = {
                     ["Insert"] = "в"
                    ,["Put"] = "в"
                    ,["Throw"] = "в"
                    ,["PutAway"] = "в"
                    ,["PutIn"] = "в"
                    ,["TakeFrom"] = "из"
                  }
  ,cnd          = if_("cell3_device._talk>=3 and cell3_device._talk<5")
}

cell3_insertfigure =
  use_ {
     ["cube_hole"] =
        choose_ {
           ["cube_hole._insert~=''"] = cell3_noinsert(cube_hole)
          ,["default"] =
              choose_ {
                 ["s==cube2"] = cell3_insert(cube_hole)
                    [[Я вставляю пластиковый куб в совпадающее с ним по форме отверстие на контейнере. Отверстие как-то
                      странно искривлено, точно по нему били молотком и загнули края -- куб влезает в отверстие лишь одним
                      краем и едва держится.]]
                ,["s==triangle"] = cell3_insert(cube_hole)
                    [[Я втыкаю пирамиду острым концом в квадратное отверстие в контейнере. Голова робота как-то
                      странно дёргается на кронштейне.]]
                ,["s==sphere"] = cell3_insert(cube_hole)
                    [[Я кладу сферу поверх квадратной прорези в контейнере и придавливаю её ладонью так, что она застревает
                      в отверстии. Голова робота пристально следит своим горящим глазом за моими действиями.]]
              }
        }
    ,["sphere_hole"] =
        choose_ {
           ["sphere_hole._insert~=''"] = cell3_noinsert(sphere_hole)
          ,["default"] =
              choose_ {
                 ["s==cube2"] = [[Вставить пластиковый куб в круглое отверстие никак не получается.]]
                ,["s==triangle"] = cell3_insert(sphere_hole)
                    [[Я опускаю пирамиду в круглую прорезь на контейнере, а затем, сам не понимая, зачем, вдруг бью кулаком
                      по торчащей из отверстия пирамиде так, что контейнер начинает сотрясаться. Механическая голова раскачивается
                      на кронштейне, как во время электрического припадка.^
                      -- Агрессия... нетерпение... -- раздаётся над моей головой сдавленный металлический голос. -- Пресечь!
                      ...будет пресекаться...]]
                ,["s==sphere"] = cell3_insert(sphere_hole)
                    [[Я кладу сферу в круглую лунку, и она почти проваливается внутрь контейнера.^
                      -- Спасибо! -- слышится у меня над головой. -- Удачный выбор.]]
              }
        }
    ,["triangle_hole"] =
        choose_ {
           ["triangle_hole._insert~=''"] = cell3_noinsert(triangle_hole)
          ,["default"] =
              choose_ {
                 ["s==cube2"] = [[Вставить куб в отверстие в форме треугольника никак не выходит.]]
                ,["s==triangle"] = cell3_insert(triangle_hole)
                    [[Я вставляю пирамиду в подходящее ему по размеру отверстие и перевожу взгляд на болтающуюся на кронштейне
                      голову робота. Я чувствую себя, как дрессированная обезьяна.]]
                ,["s==sphere"] =
                    [[Сфера никак не хочет влезать в треугольную прорезь на контейнере, можно не стараться.]]
              }
        }
    ,["cell3_shelf"] = redirect_("Put")
    ,["cell3_bed"] = redirect_("Put")
  }

cell3_putfigure =
  use_ {
     ["default"] = "Думаю, не стоит просто выбрасывать {s:M('вн')}."
    ,["cell3_bed"] =
        chain_ {
          set_("s._bed"),
          dropself,
          putself_("cell3"),
          [[Я кладу {s:M('вн')} на кровать.^
            -- Вставьте фигуры в отверстия на контейнере, -- повторяет голова робота. -- Вы не понимаете?
            Вставьте фигуры в отверстия на контейнере. Пожалуйста.]]
        }
    ,["cell3_shelf"] =
        chain_ {
          set_("s._shelf"),
          dropself,
          putself_("cell3"),
          [[Я кладу {s:M('вн')} на металлический контейнер.^
            -- Вставьте фигуры в отверстия на контейнере, -- раздаётся металлический голос. -- Не кладите фигуры
            на контейнер. Вставьте фигуры в отверстия на контейнере.]]
        }
    ,["cell3_floor"] =
        chain_ {
          set_("s._floor"),
          dropself,
          putself_("cell3"),
          [[Я бросаю {s:M('вн')} на пол.^
            -- Немедленно поднимите {s:M('вн')}! -- начинает скрежетать голова. -- Немедленно поднимите!]]
        }
    ,["cell_toilet"] = [[Боюсь, фигурка всё равно туда не провалится.]]
    ,["cube_hole"] = cell3_insertfigure
    ,["sphere_hole"] = cell3_insertfigure
    ,["triangle_hole"] = cell3_insertfigure
  }

cell3_throwfigure =
  use_ {
     ["default"] = cell3_putfigure
    ,["cell_walls"] =
        choose_ {
           ["default"] =
              chain_ {
                set_("cell3._twall"),
                set_("s._floor"),
                dropself,
                putself_("cell3"),
                [[Я размахиваюсь и кидаю {s:M('вн')} в стену. Фигурка отскакивает от стены и с глухим стуком падает на
                  пол, прямо мне под ноги.^
                  -- Поднимите {s:M('вн')}! -- командует робот. -- Выполняйте распоряжения!]]
              }
          ,["cell3._twall"] = [[Этим я ничего не добьюсь.]]
        }
    ,["cell_ceil"] =
        choose_ {
           ["default"] =
              chain_ {
                set_("cell3._tceil"),
                set_("s._floor"),
                dropself,
                putself_("cell3"),
                [[Я подбрасываю {s:M('вн')} вверх, фигурка бьёт по потолку и отскакивает на пол, к моим ногам. Голова робота
                  как-то странно вздрагивает на кронштейне.^
                  -- Фигуры... -- начинает скрежетать она. -- Вставьте фигуры в отверстия.]]
              }
          ,["cell3._tceil"] = [[Мне немного надоело жонглировать этими фигурками.]]
        }
    ,["cell_shaft"] =
        choose_ {
           ["default"] =
              chain_ {
                set_("cell3._tshaft"),
                set_("s._floor"),
                dropself,
                putself_("cell3"),
                [[Я кидаю {s:M('вн')} в вентиляционную решетку, фигурка рикошетит и отлетает в дальний конец комнаты. Механическая
                голова начинает раскачиваться на кронштейне, поблёскивая своим красным глазом, как будто пытается найти упавшую на
                пол фигурку и не может.^
                  -- Вставьте фигуры в отверстия! -- раздаётся недовольный металлический голос. -- Вставьте фигуры в отверстия!]]
              }
          ,["cell3._tshaft"] = [[Мне это ничего не даст.]]
        }
    ,["cell3_door"] =
        choose_ {
           ["default"] =
              chain_ {
                set_("cell3._tdoor"),
                set_("s._floor"),
                dropself,
                putself_("cell3"),
                [[Я бросаю {s:M('вн')} в дверь, голова робота на секунду замирает, точно испугавшись, а затем опускается на кронштейне
                  вниз и смотрит на упавшую фигурку.^
                  -- Поднимите, -- слышится необычно спокойный сдавленный голос.]]
              }
          ,["cell3._tdoor"] = [[Так я ничего не добьюсь.]]
        }
    ,["cell_toilet"] = [[Мне кажется, это уже слишком.]]
    ,["cell3_shelf"] =
        chain_ {
          set_("s._floor"),
          dropself,
          putself_("cell3"),
          [[Я бросаю {s:M('вн')} в контейнер, пластиковая фигурка со звоном отлетает от его металлической поверхности
            и падает на пол.^
            -- Поднимите фигуру! -- начинает недовольно скрежетать робот. -- Немедленно поднимите фигуру! Вставьте
            фигуры в отверстия.]]
        }
    ,["cell3_device"] =
        [[Я сжимаю в руке {s:M('вн')} и поворачиваюсь к голове робота. Пластиковая фигурка слишком
          лёгкая и вряд ли сможет нанести заметный вред чудовищному устройству, повисшему над комнатой,
          однако меня это не останавливает. Я уже поднимаю руку, как голова  робота вдруг опускается
          на кронштейне и зависает в нескольких сантиметрах надо мной. С потолка доносится сдавленный
          синтетический голос:^
          -- Агрессивное поведение недопустимо! Пройдите тест. Это в ваших же интересах!^
          Рука моя невольно опускается.]]
  }

cell3_takefigure =
  chain_ {
    choose_ {
       ["default"] = 
          choose_ {
             ["default"] = [[Я беру {s:M('вн')}.]]
            ,["have(s)"] = [[Я уже взял {s:M('вн')}.]]
          }
      ,["s._bed"] = [[Я поднимаю {s:M('вн')} с кровати.]]
      ,["s._floor"] = [[Я поднимаю {s:M('вн')} с пола.]]
      ,["s==sphere and sphere_hole._insert=='sphere'"] = 
          [[Вытащить сферу из круглого отверстия оказывается не так просто -- пальцы постоянно соскальзывают,
            и я никак не могу зацепить эту пластиковую фигурку. Наконец, я догадываюсь ударить по контейнеру снизу
            кулаком, и сфера выскакивает из лунки.^
            Голова робота испуганно вздрагивает.]]
      ,["s==sphere and cube_hole._insert=='sphere'"] =
          [[Сфера застряла в квадратной прорези, и у меня не сразу получается её вытащить. Наконец,
            я подцепляю сферу пальцем и извлекаю её из отверстия.]]
      ,["s==cube2 and cube_hole._insert=='cube2'"] = [[Я достаю куб из квадратного отверстия в контейнере.]]
      ,["s==triangle and triangle_hole._insert=='triangle'"] =
          [[Я вытаскиваю пластиковую пирамиду из треугольной прорези в контейнере.]]
      ,["s==triangle and cube_hole._insert=='triangle'"] = [[Я достаю пирамиду из квадратной дыры в контейнере.]]
      ,["s==triangle and sphere_hole._insert=='triangle'"] =
          [[Я так яростно забил пирамиду в круглую прорезь, что у меня никак не получается вытащить её обратно.
            Я упираюсь одной рукой в холодную поверхность контейнера, а второй -- изо всех тяну за основание
            пирамиды. Раздаётся неприятный металлический скрежет, пирамида выскакивает из отверстия, и я чуть не
            падаю, панически всплеснув руками.^
            Голова робота молчаливо наблюдает за этим представлением.]]
    },
    unset_("s._bed"),
    unset_("s._shelf"),
    unset_("s._floor"),
    cell3_resetinsert,
    takeself
  }

cell3_takefromfigure =
  function(s,o)
    local os = deref(s);
    if o and o._insert ~= os then
      return "В этом отверстии ".. s:M("рд") .. " нет.";
    else
      return cell3_takefigure(s,o);
    end
  end

cube2 = item {
   _bed         = false
  ,_floor       = false
  ,_shelf       = true
  ,nam          = _"куб"
  ,Exam         = [[Пластиковый куб -- точно такой же, какой я потерял.]]
  ,Put          = cell3_putfigure
  ,PutAway      = cell3_putfigure
  ,Throw        = cell3_throwfigure
  ,Take         = cell3_takefigure
  ,TakeFrom     = cell3_takefromfigure
  ,Insert       = cell3_insertfigure
  ,PutIn        = cell3_insertfigure
  ,Wreck        = [[Фигурка хоть и сделана из пластика, но довольно прочная -- она не сгибается и не трещит, когда я сжимаю её в ладони. Впрочем,
                    сил у меня уже почти не осталось.]]
  ,cnd          = if_("cell3_device._talk>=3 and cell3_device._talk<5")
}:like(pItem)

triangle = item {
   _bed         = false
  ,_floor       = false
  ,_shelf       = true
  ,nam          = _"пирамида"
  ,Exam         = [[Пирамида из грубого пластика неприятного ярко-зелёного цвета.]]
  ,Put          = cell3_putfigure
  ,PutAway      = cell3_putfigure
  ,Throw        = cell3_throwfigure
  ,Take         = cell3_takefigure
  ,TakeFrom     = cell3_takefromfigure
  ,Insert       = cell3_insertfigure
  ,PutIn        = cell3_insertfigure
  ,Wreck        = redirect_("Wreck", "cube2")
  ,cnd          = if_("cell3_device._talk>=3 and cell3_device._talk<5")
}:like(pItem)

sphere = item {
   _bed         = false
  ,_floor       = false
  ,_shelf       = false
  ,nam          = _"сфера"
  ,Exam         = [[Пластиковая сфера из тёмно-красного пластика.]]
  ,Put          = cell3_putfigure
  ,PutAway      = cell3_putfigure
  ,Throw        = cell3_throwfigure
  ,Take         = cell3_takefigure
  ,TakeFrom     = cell3_takefromfigure
  ,Insert       = cell3_insertfigure
  ,PutIn        = cell3_insertfigure
  ,Wreck        = redirect_("Wreck", "cube2")
  ,cnd          = if_("cell3_device._talk>=3 and cell3_device._talk<5")
}:like(pItem)

cube3 = item {
   _took        = false
  ,_floor       = false
  ,_throw       = false
  ,nam          = _"куб"
  ,Exam         = [[Пластиковый куб -- точно такой же, какой я потерял. Быть может, это он и есть?]]
  ,Put          = use_ {
                     ["default"] = 
                        [[Сейчас мне не хочется выпускать этот куб из рук, я даже начинаю чувствовать к нему странную привязанность.
                          Мне кажется, что, стоит мне лишь положить куда-нибудь этот куб, как он тут же исчезнет.]]
                    ,["cell_toilet"] = [[Нет, я не хочу выбрасывать куб в унитаз.]]
                    ,["cell3_doorshelf"] =
                        chain_ {
                          dropself,
                          inc_("cell3_device._talk"),
                          [[Я подчиняюсь и кладу куб на торчащей из двери лоток.^
                            -- Теперь отойдите в другой конец комнаты и сядьте на кровать! -- командует голос.]]
                        }
                  }
  ,PutAway      = redirect_("Put")
  ,Throw        = use_ {
                     ["default"] = redirect_("Put")
                    ,["cell3_device"] =
                        choose_ {
                           ["default"] =
                              chain_ {
                                dropself,
                                hideinput,
                                set_("s._floor"),
                                putself_("cell3"),
                                set_("s._throw"),
                                walkfast2_("cell3end0"),
                                ""
                              }
                          ,["s._throw"] =
                              chain_ {
                                dropself,
                                unlock_("protest"),
                                walkfast2_("dream2start"),
                                ""
                              }
                        }
                  }
  ,Take         = chain_ {
                    takeself,
                    set_("s._took"),
                    unset_("s._floor"),
                    mute_(),
                    choose_ {
                       ["default"] =
                          [[Я поднимаю с пола пластиковый куб.^
                            -- Проявление агрессии... -- дребезжит над моей головой голос.^
                            Голова робота вновь оживает и нервно вздрагивает на кроштейне, сверкая своим электрическим глазом. Из двери
                            выдвигается тонкая металлическая пластина, похожая на маленький лоток.^
                            -- Проявите благоразумие, -- говорит голос. -- Положите куб на... по-по-по... -- голос сводит икота, и тот на секунду
                            прерывается, -- ...двери. Проявите благоразумие...]]
                      ,["s._throw"] = [[Я подбираю с пола куб. Механическая голова неотрывно следит за моими действиями.]]
                    }
                  }
  ,Insert       = cell3_insertfigure
  ,PutIn        = cell3_insertfigure
  ,Wreck        = redirect_("Wreck", "cube2")
  ,cnd          = if_("cell3_device._talk>=6")
}:like(pItem)

cell3end0 = pause {
   time         = 1
  ,next         = chain_ {
                    music_("error"),
                    walk_("cell3end1")
                  }
}

cell3end1 = pause {
   pic          = "redlight"
  ,time         = 1
  ,next         = chain_ {
                    showinput,
                    walk_("cell3end2")
                  }
}

cell3end2 = pause {
   time         = 1
  ,next         = chain_ {
                     music_("droplet2")
                    ,walk_("cell3",
                      [[Неожиданно для самого себя я вдруг размахиваюсь и изо всех сил швыряю пластиковый куб в механическую голову. Однако
                        рука моя вздрагивает, и я промахиваюсь -- куб ударяет в стену рядом с кронштейном и отскакивает на пол. В это же мгновение
                        свет в комнате становится ещё ярче, а с потолка раздаётся истерический вопль:^
                        -- Прекратить! Немедленно прекратить! Агрессия будет пресекаться! -- и спустя секунду, чуть тише: -- Выполняйте распоряжение.
                        Подчиняйтесь. В противном случае будет изменён режим освещения.^
                        Я вздрагиваю при мысли о том, что свет загорится ещё сильнее.]])
                  }
}
